package com.wonders.framework.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;

import com.wonders.framework.entity.vo.Page;
import com.wonders.framework.entity.vo.Parameter;

/**
 * 基础数据操作方法
 * 
 * @author WuBin
 * 
 */
public interface BaseDao {

	/**
	 * 保存对象
	 * 
	 * @param object
	 *            对象
	 */
	public void save(Object object);

	/**
	 * 更新对象
	 * 
	 * @param object
	 *            对象
	 */
	public void update(Object object);

	/**
	 * 保存或更新对象
	 * 
	 * @param object
	 *            对象
	 */
	public void saveOrUpdate(Object object);

	/**
	 * 删除对象
	 * 
	 * @param object
	 *            对象
	 */
	public void remove(Object object);

	/**
	 * 根据主键删除对象，没有抛出ObjectNotFoundException异常
	 * 
	 * @param clazz
	 *            类
	 * @param id
	 *            主键
	 */
	public void remove(Class clazz, Serializable id);

	/**
	 * 根据主键获取对象，没有返回null
	 * 
	 * @param <T>
	 * @param clazz
	 *            类
	 * @param id
	 *            主键
	 * @return 对象
	 */
	public <T extends Object> T get(Class<T> clazz, Serializable id);

	/**
	 * 根据主键获取对象，没有抛出ObjectNotFoundException异常
	 * 
	 * @param <T>
	 * @param clazz
	 *            类
	 * @param id
	 *            主键
	 * @return 对象
	 */
	public <T extends Object> T load(Class<T> clazz, Serializable id);

	/**
	 * 获取序列
	 * 
	 * @param name
	 *            序列名
	 * @return 序列值
	 */
	public Long getSequence(String name);

	/**
	 * 执行hql语句
	 * 
	 * @param hql
	 *            语句
	 * @return 是否执行成功（影响行数>0认为成功）
	 */
	public boolean excuteHql(String hql);

	/**
	 * 执行hql语句
	 * 
	 * @param hql
	 *            语句
	 * @param args
	 *            参数
	 * @return 是否执行成功（影响行数>0认为成功）
	 */
	public boolean excuteHql(String hql, List<Parameter> args);

	/**
	 * 执行hql统计语句
	 * 
	 * @param hql
	 *            语句
	 * @return 数字
	 */
	public Integer countByHql(String hql);

	/**
	 * 执行hql统计语句
	 * 
	 * @param hql
	 *            语句
	 * @param args
	 *            参数
	 * @return 数字
	 */
	public Integer countByHql(String hql, List<Parameter> args);

	/**
	 * 执行条件查询实例统计语句
	 * 
	 * @param criteria
	 *            条件查询实例
	 * @return 数字
	 */
	public Integer countByCriteria(Criteria criteria);

	/**
	 * 执行hql查询
	 * 
	 * @param <T>
	 * @param hql
	 *            语句
	 * @param clazz
	 *            类
	 * @return 列表
	 */
	public <T extends Object> List<T> listByHql(String hql, Class<T> clazz);

	/**
	 * 执行hql查询
	 * 
	 * @param <T>
	 * @param hql
	 *            语句
	 * @param args
	 *            参数
	 * @param clazz
	 *            类
	 * @return 列表
	 */
	public <T extends Object> List<T> listByHql(String hql,
			List<Parameter> args, Class<T> clazz);

	/**
	 * 执行criteria查询
	 * 
	 * @param <T>
	 * @param criteria
	 *            条件查询示例
	 * @param clazz
	 *            类
	 * @return 列表
	 */
	public <T extends Object> List<T> listByCriteria(Criteria criteria,
			Class<T> clazz);

	/**
	 * 执行hql分页查询
	 * 
	 * @param hql
	 *            语句
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageByHql(String hql, Page page);

	/**
	 * 执行hql分页查询
	 * 
	 * @param hql
	 *            语句
	 * @param args
	 *            参数
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageByHql(String hql, List<Parameter> args, Page page);

	/**
	 * 执行条件查询实例分页查询
	 * 
	 * @param criteria
	 *            条件查询实例
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageByCriteria(Criteria criteria, Page page);

	/**
	 * 使用hql查找唯一结果
	 * 
	 * @param <T>
	 * @param hql
	 *            语句
	 * @param clazz
	 *            类
	 * @return 对象
	 */
	public <T extends Object> T findByHql(String hql, Class<T> clazz);

	/**
	 * 使用hql查找唯一结果
	 * 
	 * @param <T>
	 * @param hql
	 *            语句
	 * @param args
	 *            参数
	 * @param clazz
	 *            类
	 * @return 对象
	 */
	public <T extends Object> T findByHql(String hql, List<Parameter> args,
			Class<T> clazz);

	/**
	 * 使用criteria查找唯一结果
	 * 
	 * @param <T>
	 * @param criteria
	 *            条件查询实例
	 * @param clazz
	 *            类
	 * @return 对象
	 */
	public <T extends Object> T findByCriteria(Criteria criteria, Class<T> clazz);

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 *            语句
	 * @return 是否执行成功（影响行数>0认为成功）
	 */
	public boolean excuteSql(String sql);

	/**
	 * 执行sql语句
	 * 
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @return 是否执行成功（影响行数>0认为成功）
	 */
	public boolean excuteSql(String sql, List<Parameter> args);

	/**
	 * 执行sql统计语句
	 * 
	 * @param hql
	 *            语句
	 * @return 数字
	 */
	public Integer countBySql(String sql);

	/**
	 * 执行sql统计语句
	 * 
	 * @param hql
	 *            语句
	 * @param args
	 *            参数
	 * @return 数字
	 */
	public Integer countBySql(String sql, List<Parameter> args);

	/**
	 * 执行sql查询
	 * 
	 * @param sql
	 *            语句
	 * @return map列表
	 */
	public List<Map<String, Object>> listBySql(String sql);

	/**
	 * 执行sql查询
	 * 
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @return map列表
	 */
	public List<Map<String, Object>> listBySql(String sql, List<Parameter> args);

	/**
	 * 执行sql查询
	 * 
	 * @param <T>
	 * @param sql
	 *            语句
	 * @param clazz
	 *            类
	 * @return 列表
	 */
	public <T extends Object> List<T> listBySql(String sql, Class<T> clazz);

	/**
	 * 执行sql查询
	 * 
	 * @param <T>
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @param clazz
	 *            类
	 * @return 列表
	 */
	public <T extends Object> List<T> listBySql(String sql,
			List<Parameter> args, Class<T> clazz);

	/**
	 * 执行sql分页查询
	 * 
	 * @param sql
	 *            语句
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageBySql(String sql, Page page);

	/**
	 * 执行sql分页查询
	 * 
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageBySql(String sql, List<Parameter> args, Page page);

	/**
	 * 执行sql分页查询
	 * 
	 * @param sql
	 *            语句
	 * @param clazz
	 *            类
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageBySql(String sql, Class clazz, Page page);

	/**
	 * 执行sql分页查询
	 * 
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @param clazz
	 *            类
	 * @param page
	 *            分页参数
	 * @return 分页对象
	 */
	public Page pageBySql(String sql, List<Parameter> args, Class clazz,
			Page page);

	/**
	 * 使用sql查找唯一结果
	 * 
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @return map对象
	 */
	public Map<String, Object> findBySql(String sql);

	/**
	 * 使用sql查找唯一结果
	 * 
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @return map对象
	 */
	public Map<String, Object> findBySql(String sql, List<Parameter> args);

	/**
	 * 使用sql查找唯一结果
	 * 
	 * @param <T>
	 * @param sql
	 *            语句
	 * @param clazz
	 *            类
	 * @return 对象
	 */
	public <T extends Object> T findBySql(String sql, Class<T> clazz);

	/**
	 * 使用sql查找唯一结果
	 * 
	 * @param <T>
	 * @param sql
	 *            语句
	 * @param args
	 *            参数
	 * @param clazz
	 *            类
	 * @return 对象
	 */
	public <T extends Object> T findBySql(String sql, List<Parameter> args,
			Class<T> clazz);

}
